package edu.cque.jt.provider.controller;

import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;


/**
 * @author Hua
 * @create 2022-07-20 23:14
 * 基于此类演示配置中心的作用
 * 基于日志对象进行日志输出测试
 */
//@Slf4j
@RestController
@RefreshScope// 告诉spring底层,配置中心内容发生变化,重新构建此对象
public class ProviderLogController {
    /*
     org.slf4j.LoggerFactory   (java 中的日志API规范,基于这个规范有Log4j,Logback)
     传入当前所在类的字节码对象
     假如在log对象所在类上使用了@Slf4j注解,log不再需要我们手动创建,lombok会自动帮我们创建
     */
    private static Logger log = LoggerFactory.getLogger(ProviderController.class);

    @GetMapping("/provider/doLog01")
    public String doLog01() {
        log.trace("======trace=====");
        log.debug("======debug=====");
        log.info("======info=====");
        log.warn("======warn=====");
        log.error("======error=====");
        return "log config test";
    }

    //对象属性值与nacos的同步
    /*
       对象创建的时候levelLog进行初始化, levelLog属性初始化时,开始读取配置
       也就是通过@value获取的配置中心的内容赋值给变量以后,levelLog并不会随着配置中心的变化而变化,因为只有一个对象,而且没有重新赋值里面的内容
       而log日志对象的输出级别却可以动态自动更新
       如果要保证@value获取的配置信息和log对象一样,随着配置中心而动态更新,需要在类名上加@RefreshScope注解,从而变成多例模式.
     */
    @Value("${logging.level.edu.cque.jt:info}")
    private String levelLog;

    @GetMapping("/provider/doLog02")
    public String doLog02() {
        log.info("这里是控制台: log.level is {}", levelLog);
        return "log level is  " + levelLog;
    }
}
